package com.junzhiit.nengji.cms.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.junzhiit.nengji.cms.service.AdvertiseTypeService;
import com.junzhiit.nengji.cms.web.exception.AdvertiseTypeHasUseException;
import com.junzhiit.nengji.cms.web.exception.AdvertiseTypeIsExistException;
import com.junzhiit.nengji.cms.web.exception.AdvertiseTypeNotFoundException;
import com.junzhiit.nengji.cms.web.exception.NameIsExistException;
import com.junzhiit.nengji.cms.web.util.OrderNumberUtils;
import com.junzhiit.nengji.cms.web.util.ViewObjectUtil;
import com.junzhiit.nengji.cms.web.vo.AdvertiseTypeAddVO;
import com.junzhiit.nengji.cms.web.vo.AdvertiseTypeEditVO;
import com.junzhiit.nengji.cms.web.vo.AdvertiseTypeVO;
import com.junzhiit.nengji.cms.web.vo.DataTablesParamVO;
import com.junzhiit.nengji.cms.web.vo.ResultVO;
import com.junzhiit.nengji.dao.AdvertiseDAO;
import com.junzhiit.nengji.dao.AdvertiseTypeDAO;
import com.junzhiit.nengji.dao.cache.AdvertiseTypeCacheDAO;
import com.junzhiit.nengji.dao.util.DIYKey;
import com.junzhiit.nengji.model.Advertise;
import com.junzhiit.nengji.model.AdvertiseType;
import com.junzhiit.nengji.model.enums.isMobile;

@Service
public class AdvertiseTypeServiceImpl extends BaseServiceImpl implements AdvertiseTypeService {

	@Autowired
	private AdvertiseTypeDAO advertiseTypeDAO;
	
	@Autowired
	private AdvertiseDAO advertiseDAO;

	@Autowired
	private AdvertiseTypeCacheDAO advertiseTypeCacheDAO;

	@Override
	public Map<String, Object> findAll(DataTablesParamVO dtp, AdvertiseTypeVO advertiseTypeVO) {
		AdvertiseType advertiseType = new AdvertiseType();
		BeanUtils.copyProperties(advertiseTypeVO, advertiseType);
		
		List<AdvertiseType> list = advertiseTypeDAO.findAll(dtp.getStart(), dtp.getLength(), advertiseType);
		List<AdvertiseTypeVO> listVO =getAdvertiseTypeVOList(list);
		int totalCount = advertiseTypeDAO.getTotalCount(advertiseType);
		
		return ViewObjectUtil.dataTables(listVO, dtp.getDraw(), totalCount);
	}

	public List<AdvertiseTypeVO> getAdvertiseTypeVOList(List<AdvertiseType> list) {
		List<AdvertiseTypeVO> listVO = new ArrayList<AdvertiseTypeVO>();
		for (AdvertiseType advertiseType : list) {
			AdvertiseTypeVO advertiseTypeVO = new AdvertiseTypeVO();
			BeanUtils.copyProperties(advertiseType, advertiseTypeVO);
			listVO.add(advertiseTypeVO);
		}
		return listVO;
	}
	
	@Override
	public ResultVO add(AdvertiseTypeAddVO advertiseTypeAddVO) {
		AdvertiseType advertiseType = new AdvertiseType();
		BeanUtils.copyProperties(advertiseTypeAddVO, advertiseType);
		ResultVO resultVO = new ResultVO();
		
		int count = advertiseTypeDAO.getAdvertiseTypeExist(advertiseType);
		if (count > 0) {
			throw new AdvertiseTypeIsExistException("广告类型已经存在");
		}
		
		Long index = advertiseTypeCacheDAO.incr(DIYKey.getAdvertiseTypeCodeStringKey());
		String code = OrderNumberUtils.getSystemCode(OrderNumberUtils.ADVERTISE_TYPE_NUMBER_PREFIX, index.intValue());
		advertiseType.setCode(code);
		advertiseType.setIsMobile(isMobile.WAP.toIntValue());
		
		AdvertiseType param = advertiseTypeDAO.insert(advertiseType);
		
		AdvertiseTypeVO advertiseTypeVO = new AdvertiseTypeVO();
		BeanUtils.copyProperties(param, advertiseTypeVO);
		
		resultVO.setData(advertiseTypeVO);
		return resultVO;
	}

	@Override
	public ResultVO delete(String id) {
		ResultVO resultVO = new ResultVO();
		AdvertiseType advertiseType = advertiseTypeDAO.query(id);
		if (advertiseType == null) {
			throw new AdvertiseTypeNotFoundException("该广告类型不存在！");
		}
		Advertise advertise=new Advertise();
		advertise.setAdvertiseTypeId(id);
		int count=advertiseDAO.getTotalCount(advertise);
		if(count>0){
			throw new AdvertiseTypeHasUseException("广告类型已经被使用");
		}
		resultVO.setData(advertiseTypeDAO.updateToDelete(id));
		return resultVO;
	}

	@Override
	public ResultVO edit(AdvertiseTypeEditVO advertiseTypeEditVO) {
		AdvertiseType advertiseType = new AdvertiseType();
		BeanUtils.copyProperties(advertiseTypeEditVO, advertiseType);
		ResultVO resultVO = new ResultVO();
		
		AdvertiseType param = advertiseTypeDAO.query(advertiseTypeEditVO.getId());
		
		if (param == null) {
			throw new AdvertiseTypeNotFoundException("该广告类型不存在！");
		}
		if (!param.getName().equals(advertiseType.getName())) {
			if (advertiseTypeDAO.getAdvertiseTypeExist(advertiseType) > 0) {
				throw new NameIsExistException("广告类型名称已经存在");
			}
		}
		BeanUtils.copyProperties(advertiseTypeEditVO, param);
		param.setUpdatedTime(new Date());
		
		resultVO.setData(advertiseTypeDAO.update(param));
		return resultVO;
	}

	@Override
	public ResultVO findById(String id) {
		ResultVO resultVO = new ResultVO();
		AdvertiseType advertiseType = advertiseTypeDAO.query(id);
		if (advertiseType == null) {
			throw new AdvertiseTypeNotFoundException("该广告类型不存在！");
		}
		AdvertiseTypeVO advertiseTypeVO = new AdvertiseTypeVO();
		BeanUtils.copyProperties(advertiseType, advertiseTypeVO);
		resultVO.setData(advertiseTypeVO);
		return resultVO;
	}

	@Override
	public ResultVO getList() {
		ResultVO result = new ResultVO();
		List<AdvertiseType> list = advertiseTypeDAO.getList();
		List<AdvertiseTypeVO> listVO =getAdvertiseTypeVOList(list);
		result.setData(listVO);
		return result;
	}
}
